package j.framework.tags;

import j.framework.qmd.core.*;
import j.util.ConvertUtils;
import j.util.New;
import j.util.StringUtils;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.util.*;

/**
 * User: jason
 * Date: 14-9-2 下午4:46
 */
public class DataGridTag extends SimpleTagSupport {
    private String id;
    private String key;
    private String optOptions;
    private String style;//table元素的样式定义，形如：width:100%;color:#f00;
    private String toolbarId;//不需要#号
    private int pageSize;
    private String pageList;//用逗号隔开数字
    private String params;

    @Override
    public void doTag() throws JspException, IOException {

        if (StringUtils.isNullOrEmpty(id)) {
            id = "dg";
        }

        String primaryKey = null;

        //先根据key获取数据
        QueryMetadata qmd = QueryManager.getQueryMetadata(key);
        if (qmd == null) {
            getJspContext().getOut().write("获取查询数据失败！");
            return;
        }
        StringBuilder s = new StringBuilder();
        s.append("<table class=\"");
        if (qmd.isShowByTree()) {
            s.append("easyui-treegrid");
        } else {
            s.append("easyui-datagrid");
        }
        s.append("\" id=\"").append(id).append("\"");
        if (StringUtils.isNotEmpty(style)) {
            s.append(" style=\"").append(style).append("\"");
        }
        //配置data-options
        String url = "/user/sys/qmdManager?act=q&queryId=" + qmd.getQueryId();
        if (StringUtils.isNotEmpty(params)) {
            if (!url.endsWith("&")) {
                url += "&";
            }
            url += params;
        }
        s.append(" data-options=\"")
                .append("url:'").append(url).append("'")
                .append(",fit:true");
        s.append(",striped:true");
        if (qmd.isPagingSupported()) {
            s.append(",pagination:true");
            //构造默认页大小
            if (pageSize > 0) {
                s.append(",pageSize:").append(pageSize);
            } else if (qmd.getDefaultPageSize() != null && qmd.getDefaultPageSize() > 0) {
                s.append(",pageSize:").append(qmd.getDefaultPageSize());
            }
            //构造pageList
            if (StringUtils.isNullOrEmpty(pageList)) {
                //没有在tag上指定，再检测一下后台有无指定
                pageList = qmd.getDefaultPageList();
            }
            if (StringUtils.isNotEmpty(pageList)) {
                Set<String> set = StringUtils.asLSet(pageList, ",");
                Set<Integer> intSet = New.lset(set.size());
                int inte;
                for (String ss : set) {
                    inte = ConvertUtils.toInt(ss, 0);
                    if (inte > 0) {
                        intSet.add(inte);
                    }
                }
                if (intSet.size() > 0) {
                    s.append(",pageList:[");
                    for (Integer i : intSet) {
                        s.append(i).append(",");
                    }
                    s.deleteCharAt(s.length() - 1);
                    s.append("]");
                }
            }
        }
        if (qmd.isFooterSupported()) {
            s.append(",showFooter:true");
        }
        //if (!qmd.isMultiSelectSupported()) {
        s.append(",singleSelect:true");
        //}
        if (qmd.isMultiSelectSupported()) {
            s.append(",selectOnCheck:false,checkOnSelect:false");
        }
        //构造排序
        if (null != qmd.getDefaultQuerySort() && qmd.getDefaultQuerySort().size() > 0) {
            s.append(",sortName:'").append(qmd.getDefaultSortNames()).append("'");
            s.append(",sortOrder:'").append(qmd.getDefaultOrders()).append("'");
        }
        //看是否支持多列排序
        if (qmd.isMultiColumnSortedSupported()) {
            s.append(",multiSort:true");
        }
        //构造主键，若为复合主键，则不再处理
        if (qmd.getPrimaryKeys() != null && qmd.getPrimaryKeys().size() == 1) {
            primaryKey = qmd.getPrimaryKeys().get(0).getFieldKey();
            s.append(",idField:'").append(primaryKey).append("'");
        }
        //构造toolbar
        if (StringUtils.isNotEmpty(toolbarId)) {
            s.append(",toolbar:'#").append(toolbarId).append("'");
        }
        //如果以树形展示，需要指定treeField字段
        if (qmd.isShowByTree()) {
            s.append(",treeField:'").append(qmd.getTreeField().getFieldKey()).append("'");
        }
        //显示行号
        if (qmd.isShowRowNumbers()) {
            s.append(",rownumbers:true");
        }

        //增加行点击事件
        if (StringUtils.isNotEmpty(qmd.getRowClick())) {
            s.append(",onClickRow:").append(qmd.getRowClick());
        }
        //增加onLoadSuccess事件
        s.append(",onLoadSuccess:easyuiDataGridOnLoadSuccess");
        s.append("\">");  //构造data-options结束
        Collection<DataGridColumn> collections = qmd.columns.values();
        List<DataGridColumn> columns = New.list();
        columns.addAll(collections);
        Collections.sort(columns);
        //构造操作区域
        if (qmd.isOperatorSupported() || qmd.isMultiSelectSupported() || (qmd.getFrozenLeftColumns() != null && qmd.getFrozenLeftColumns() > 0)) {
            /**
             * <thead data-options="frozen:true">
             <tr><th data-options="field:'opt'">操作</th></tr>
             </thead>
             */
            s.append("<thead data-options=\"frozen:true\"><tr>");
            if (qmd.isOperatorSupported()) {
                if (StringUtils.isNullOrEmpty(optOptions) || !optOptions.equals("no")) {
                    s.append("<th data-options=\"field:'opt'\">操作</th>");
                }
            }
            //看是否支持多选，若是，则以checkbox做为多选
            if (qmd.isMultiSelectSupported()) {
                s.append("<th data-options=\"field:'");
                if (qmd.getPrimaryKeys() != null && qmd.getPrimaryKeys().size() > 0) {
                    //qmd.getPrimaryKeys().get(0).getDataColumnId()
                    s.append("desId");
                }
                s.append("',checkbox:true\">选择</th>");
            }
            //看是否要左冻结几列
            if (qmd.getFrozenLeftColumns() != null && qmd.getFrozenLeftColumns() > 0) {
                List<DataGridColumn> frozeLeftColumns = New.list(qmd.getFrozenLeftColumns());
                for (int i = 0; i < columns.size(); i++) {
                    if (i == qmd.getFrozenLeftColumns()) {
                        break;
                    }
                    frozeLeftColumns.add(columns.get(i));
                }
                columns.removeAll(frozeLeftColumns);
                buildTableColumns(qmd, frozeLeftColumns, s);
            } else {
                s.append("</tr></thead>");
            }
        }
        //构造数据行区域

        s.append("<thead>");
        s.append("<tr>");
        buildTableColumns(qmd, columns, s);

        s.append("</table>");
        s.append("<script>");
        s.append("var $").append(id).append("=$('#").append(id).append("');");
        s.append("function get").append(id).append("Id(){");
        s.append("var row = $").append(id).append(".");
        if (qmd.isShowByTree()) {
            s.append("treegrid");
        } else {
            s.append("datagrid");
        }
        s.append("('getSelected');");
        s.append("if(row){return row['").append(primaryKey).append("'];}else{return '';}");
        s.append("}");
        s.append(" function easyuiDataGridOnLoadSuccess(){");
        if (qmd.getFrozenTopRows() != null && qmd.getFrozenTopRows() > 0) {
            s.append("$(this)");
            for (int i = 0; i < qmd.getFrozenTopRows(); i++) {
                s.append(".datagrid('freezeRow',");
                s.append(i);
                s.append(")");
            }
            s.append(";");
        }
        s.append("}");
        s.append("</script>");
        getJspContext().getOut().write(s.toString());
    }

    private void buildTableColumns(QueryMetadata qmd, List<DataGridColumn> columns, StringBuilder s) {
        QueryFieldMetadata qfmd;
        DataGridColumn c;
        if (qmd.isHasGroupColumns()) {
            Iterator<DataGridColumn> iterator = columns.iterator();
            List<DataGridColumn> groupColumns = New.list();
            while (iterator.hasNext()) {
                //<th data-options="field:'itemid',width:80" rowspan="2">Item ID</th>
                c = iterator.next();
                if (c.subColumns.size() == 0) {
                    //这个不是分组列
                    qfmd = qmd.getFieldMetadata(c.getFieldKey());
                    s.append("<th data-options=\"");
                    s.append("field:'").append(qfmd.getFieldKey()).append("'");
                    if (qfmd.isSortSupported()) {
                        s.append(",sortable:true");
                    }
                    if (qfmd.getWidth() >= 30) {
                        s.append(",width:").append(qfmd.getWidth());
                    }
                    //字段内容对齐方式
                    if (!qfmd.getColumnDataAlign().equals(DataAlign.LEFT)) {
                        s.append(",align:'").append(qfmd.getColumnDataAlign().toString().toLowerCase()).append("'");
                    }
                    //表头对齐
                    if (!qfmd.getColumnHeaderAlign().equals(DataAlign.LEFT)) {
                        s.append(",halign:'").append(qfmd.getColumnHeaderAlign().toString().toLowerCase()).append("'");
                    }
                    //客户端格式化事件
                    if (StringUtils.isNotEmpty(qfmd.getClientFormatter())) {
                        s.append(",formatter:").append(qfmd.getClientFormatter());
                    }
                    //构造深度
                    s.append("\" rowspan=\"").append(qmd.getGroupDepth());
                    s.append("\">").append(qfmd.getDisplayName());
                    s.append("</th>");
                    //这列已循环处理过，可以删除了
                    iterator.remove();
                } else {
                    //这是分组列
                    s.append("<th colspan=\"").append(c.subColumns.size()).append("\">");
                    s.append(c.getTitle());
                    s.append("</th>");
                    groupColumns.addAll(c.subColumns.values());
                }
            }
            s.append("</tr></thead>");
            //第一轮多表头已处理，递归处理第二轮以后的多表头
            processGroupHeaders(qmd, groupColumns, s);
            if (columns.size() > 0) {
                s.append("<thead><tr>");
                for (DataGridColumn cc : columns) {
                    if (cc.isSuperHeader()) {
                        for (DataGridColumn c1 : cc.subColumns.values()) {
                            qfmd = qmd.getFieldMetadata(c1.getFieldKey());
                            s.append("<th data-options=\"");
                            s.append("field:'").append(qfmd.getFieldKey()).append("'");
                            if (qfmd.isSortSupported()) {
                                s.append(",sortable:true");
                            }
                            if (qfmd.getWidth() >= 30) {
                                s.append(",width:").append(qfmd.getWidth());
                            }
                            //字段内容对齐方式
                            if (!qfmd.getColumnDataAlign().equals(DataAlign.LEFT)) {
                                s.append(",align:'").append(qfmd.getColumnDataAlign().toString().toLowerCase()).append("'");
                            }
                            //表头对齐
                            if (!qfmd.getColumnHeaderAlign().equals(DataAlign.LEFT)) {
                                s.append(",halign:'").append(qfmd.getColumnHeaderAlign().toString().toLowerCase()).append("'");
                            }
                            //客户端格式化事件
                            if (StringUtils.isNotEmpty(qfmd.getClientFormatter())) {
                                s.append(",formatter:").append(qfmd.getClientFormatter());
                            }
                            s.append("\">").append(qfmd.getDisplayName());
                            s.append("</th>");
                        }
                    }
                }
                s.append("</tr>");
                s.append("</thead>");
            }
        } else {
            //没有多表头
            for (DataGridColumn c1 : columns) {
                qfmd = qmd.getFieldMetadata(c1.getFieldKey());
                s.append("<th data-options=\"");
                s.append("field:'").append(qfmd.getFieldKey()).append("'");
                if (qfmd.isSortSupported()) {
                    s.append(",sortable:true");
                }
                if (qfmd.getWidth() >= 30) {
                    s.append(",width:").append(qfmd.getWidth());
                }
                //字段内容对齐方式
                if (!qfmd.getColumnDataAlign().equals(DataAlign.LEFT)) {
                    s.append(",align:'").append(qfmd.getColumnDataAlign().toString().toLowerCase()).append("'");
                }
                //表头对齐
                if (!qfmd.getColumnHeaderAlign().equals(DataAlign.LEFT)) {
                    s.append(",halign:'").append(qfmd.getColumnHeaderAlign().toString().toLowerCase()).append("'");
                }
                //客户端格式化事件
                if (StringUtils.isNotEmpty(qfmd.getClientFormatter())) {
                    s.append(",formatter:").append(qfmd.getClientFormatter());
                }
                s.append("\">").append(qfmd.getDisplayName());
                s.append("</th>");
            }
            s.append("</tr></thead>");
        }

    }

    private int processGroupDepth = 1;

    private void processGroupHeaders(QueryMetadata qmd, Collection<DataGridColumn> columns, StringBuilder s) {
        if (processGroupDepth == qmd.getGroupDepth()) {
            return;
        }
        List<DataGridColumn> list = New.list();
        list.addAll(columns);
        Collections.sort(list);
        Iterator<DataGridColumn> iterator = list.iterator();
        DataGridColumn c;
        boolean isFirstAdd = true;
        while (iterator.hasNext()) {
            c = iterator.next();
            if (c.isSuperHeader()) {
                if (isFirstAdd) {
                    s.append("<tr>");
                    isFirstAdd = false;
                }
                //这是多表头
                s.append("<th colspan=\"").append(c.subColumns.size()).append("\">");
                s.append(c.getTitle());
                s.append("</th>");
            }
            iterator.remove();
        }
        if (!isFirstAdd) {
            s.append("</tr>");
        }
        processGroupDepth++;
        processGroupHeaders(qmd, list, s);
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public void setOptOptions(String optOptions) {
        this.optOptions = optOptions;
    }

    public void setParams(String params) {
        this.params = params;
    }

    public void setStyle(String style) {
        this.style = style;
    }

    public void setToolbarId(String toolbarId) {
        this.toolbarId = toolbarId;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public void setPageList(String pageList) {
        this.pageList = pageList;
    }
}
